package xyz.lwm.lazycat.utility.reflect;

import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * <h2>注解中的方法别名</h2>
 *
 * <pre>{@code
 * @Retention(RetentionPolicy.RUNTIME)
 * @Target(ElementType.TYPE)
 * public @interface MapperScan {
 *     String[] basePackages() default {};
 *     // value 的值赋值给 basePackages;
 *     // 因为 basePackages 上面没有 @Alias 注解, 则 basePackages 不会给 value;
 *     @Alias("basePackages")
 *     String[] value() default {};
 * }
 * }</pre>
 *
 * <pre>{@code
 * @Retention(RetentionPolicy.RUNTIME)
 * @Target(ElementType.TYPE)
 * // 元注解
 * @Bean
 * public @interface Service {
 *     // value 的值赋值给元注解 Bean 的 value 属性
 *     // 当然也可以 @Alias(annotation = Bean.class, value = "xxx"), 将 value 的值赋值给元注解 Bean 的 xxx 属性
 *     @Alias(annotation = Bean.class)
 *     String value() default "";
 * }
 * }</pre>
 * @author lwm
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AliasTo {

    /**
     * 注解属性别名, 表示该属性的非空值可以赋值给别名的空属性
     */
    String value() default "";

    /**
     * 注解类型, 如果 annotation 为 Annotation.class, 则表示该注解的属性值赋值给该注解的其他属性
     */
    Class<? extends Annotation> annotation() default Annotation.class;

}
